package c04.thread.activity;

import lombok.extern.slf4j.Slf4j;
import util.Sleeper;

/**
 * 活锁出现在两个线程互相改变对方的结束条件，最后谁也无法结束。
 * 与死锁的区别：
 * 死锁中线程因为获取不到对方的锁而被阻塞。陷入阻塞状态的线程不占用CPU时间片
 * 活锁中的线程是因为被对方修改结束条件而一直在运行，无法结束。陷入活锁的线程会一直消耗CPU时间片
 *
 * 解决方法: 修改结束条件，合理安排线程的等待时间
 */
@Slf4j(topic = "c.LiveLock")
public class LiveLock {
    static volatile int count = 10;
    static final Object lock = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            while (count > 0) {
                Sleeper.sleep(0.2);
                count--;
                log.debug("count: {}", count);
            }
        }, "t1").start();

        new Thread(() -> {
            while (count < 20) {
                Sleeper.sleep(0.2);
                count++;
                log.debug("count: {}", count);
            }
        }, "t2").start();
    }
}
